package ar.edu.utn.frba.dds.tp.code.usuarios;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.uqbar.commons.model.Entity;
import org.uqbar.commons.utils.Observable;

import uqbar.arena.persistence.annotations.PersistentClass;
import uqbar.arena.persistence.annotations.PersistentField;

import ar.edu.utn.frba.dds.tp.code.Asientos.AsientoDeVuelo;
import ar.edu.utn.frba.dds.tp.code.filtros.PredicateSoloAsientosLibres;
import ar.edu.utn.frba.dds.tp.code.lugares.Lugar;
import ar.edu.utn.frba.dds.tp.code.ordenamientos.CriterioOrdenVuelos;
import ar.edu.utn.frba.dds.tp.code.vuelos.Busqueda;
import ar.edu.utn.frba.dds.tp.code.vuelos.Vuelo;

import com.google.common.base.Predicate;

@Observable
@PersistentClass
@SuppressWarnings("serial")
public abstract class Usuario extends Entity {

	protected BigDecimal recargo;
	private List<Busqueda> busquedasRealizadas = new ArrayList<Busqueda>();
	private Integer dni; 
	private String nombre;

	
	@PersistentField
	public BigDecimal getRecargo() {
		return recargo;
	}
	
	public void setRecargo(BigDecimal rec) {
		this.recargo = rec;
	}
	
	@PersistentField
	public Integer getDni() {
		return dni;
	}

	public void setDni(Integer dni) {
		this.dni = dni;
	}
	@PersistentField
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// +++ transients +++++++++++++++++++++++++++++++++++++++++++++
	// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
	
	public List<Busqueda> getBusquedasRealizadas() {
		return busquedasRealizadas;
	}
	
	public void setBusquedasRealizadas(List<Busqueda> busquedas) {   //esto me parece que esta de mas
		busquedasRealizadas = busquedas;
	}
	// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// +++ Métodos ++++++++++++++++++++++++++++++++++++++++++++++++
	// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//FIXME Arreglar todo esto bien bonito
	public Busqueda buscarVuelosSinGuardarHistorial(Lugar origen, Lugar destino,
			Date fechaSalida ) {
				Busqueda busqueda = new Busqueda(origen, destino, fechaSalida);
				ArrayList<Predicate<AsientoDeVuelo>> filtroSoloDisponibles = new ArrayList<Predicate<AsientoDeVuelo>>();
				filtroSoloDisponibles.add(new PredicateSoloAsientosLibres());
				busqueda.setVuelos(busqueda.getVuelos(filtroSoloDisponibles));
				return sacarSuperOfertas(busqueda);
			}
	
	public List<Vuelo> buscarVuelos(Lugar origen, Lugar destino, Date fechaSalida,
			                         ArrayList<Predicate<AsientoDeVuelo>> filtros, CriterioOrdenVuelos criterio) {
				Busqueda busqueda = this.buscarVuelosSinGuardarHistorial(origen, destino,
						fechaSalida);
				busqueda.getVuelos(filtros);
				if(criterio != null) {
					busqueda.getVuelos(criterio);
				}
				busqueda.removerVuelosSinAsientos();
				this.getBusquedasRealizadas().add(busqueda);
				return busqueda.getVuelos();
			}
	
	protected Busqueda sacarSuperOfertas(Busqueda busqueda) {
		List<Vuelo> vuelosDisponibles = busqueda.getVuelos();
		for (Vuelo vuelo : vuelosDisponibles) {
			vuelo.asientosNoSuperOferta();
		}
		busqueda.setVuelos(vuelosDisponibles);
		return busqueda;
	}

	public void comprarAsiento(AsientoDeVuelo asiento) {
		asiento.comprar(this);
	}

	public BigDecimal getPrecioAsiento(AsientoDeVuelo asiento) {
		return asiento.getVuelo().getPrecioAsiento(asiento).add(this.getRecargo());
	}

}
